package lc3

/*
 * @lc app=leetcode.cn id=3 lang=golang
 *
 * [3] 无重复字符的最长子串
 */

func max(a, b int) int {
	if a >= b {
		return a
	}
	return b
}

// 0 <= s.length <= 5 * 10^4
// s 由英文字母、数字、符号和空格组成
// 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
func lengthOfLongestSubstring(s string) int {
	maxLen := 0
	charIndex := make(map[byte]int, 0)
	windowIndexBegin := 0
	windowSize := 0
	for i := 0; i < len(s); i++ {
		index, ok := charIndex[s[i]]
		if ok && index >= windowIndexBegin { // 只查找窗口内的数据
			windowSize = i - index
			windowIndexBegin = index
		} else {
			windowSize++
		}
		maxLen = max(maxLen, windowSize)
		charIndex[s[i]] = i
	}

	return maxLen
}
